package com.example.controller;


import com.example.dto.LoginRequest;
import com.example.dto.LoginResponse;
import com.example.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;



/**
 * 用户控制器
 * 处理用户相关的HTTP请求
 */
@RestController // 标识这是一个RESTful控制器，返回值会自动序列化为JSON
@RequestMapping("/api/user") // 定义基础请求路径
public class UserController {

    /**
     * 日志记录器
     * 用于记录操作日志和错误信息
     */
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    /**
     * 用户服务
     * 使用@Autowired自动注入UserService实例
     */
    @Autowired
    private UserService userService;

    /**
     * 用户登录接口
     * @param loginRequest 登录请求参数
     * @return 统一格式的登录结果
     *
     * @PostMapping: 处理HTTP POST请求，路径为 /api/user/login
     * @RequestBody: 表示从请求体中获取JSON参数并转换为LoginRequest对象
     * @Valid: 启用参数验证（这里需要配合验证注解使用）
     *
     * 注意：这个方法不需要手动返回Result格式，GlobalResponseAdvice会自动包装
     */
    @PostMapping("/login")
    public LoginResponse login(@RequestBody LoginRequest loginRequest) {
        // 记录登录请求日志
        logger.info("用户登录请求: userName={}", loginRequest.getUserName());

        // 调用Service层处理登录逻辑
        LoginResponse loginResponse = userService.login(loginRequest);

        // 记录登录成功日志
        logger.info("用户登录成功: userId={}, userName={}",
                loginResponse.getUserId(), loginResponse.getUserName());

        // 直接返回业务数据，GlobalResponseAdvice会自动包装成Result格式
        return loginResponse;
    }

    /**
     * 用户注销接口
     * @return 注销结果
     *
     * 注意：这个方法返回void，GlobalResponseAdvice会自动包装成成功的Result
     */
    @PostMapping("/logout")
    public void logout() {
        // 实际项目中应该在这里处理令牌失效等逻辑
        logger.info("用户注销操作");
        // 由于返回void，GlobalResponseAdvice会自动包装成Result.success()
    }

    /**
     * 获取当前用户信息
     * @return 用户信息
     *
     * 这个接口演示了GET请求的处理
     */
    @GetMapping("/info")
    public LoginResponse getUserInfo() {
        // 这里简化实现，实际应该从令牌中获取用户ID
        logger.info("获取用户信息");

        // 模拟返回用户信息
        LoginResponse response = new LoginResponse();
        response.setUserId(1);
        response.setUserName("admin");
        response.setToken("mock-token");

        return response;
    }
}